#ifndef FHE_CORE_NODEREGISTERER_H
#define FHE_CORE_NODEREGISTERER_H

#include <fhe/core/NodeFactory.h>
#include <fhe/core/NodeDesc.h>

namespace fhe
{
  namespace core
  {
    template <class T>
    class NodeRegisterer
    {
    public:
      NodeRegisterer( const std::string& module, const std::string& name )
      {
        INodeDesc::Ptr nodeDesc( new NodeDesc<T> );
        nodeDesc->setModule( module );
        nodeDesc->setName( name );
        NodeFactory::instance().addNodeDesc( nodeDesc );
      }
      
      NodeRegisterer( const std::string& module, const std::string& name, const std::string& parentModule, const std::string& parentName )
      {
        INodeDesc::Ptr nodeDesc( new NodeDesc<T> );
        nodeDesc->setModule( module );
        nodeDesc->setName( name );
        nodeDesc->setParent( parentModule, parentName );
        NodeFactory::instance().addNodeDesc( nodeDesc );
      }
    };
    
    #define FHE_NODE( module, name ) ::fhe::core::NodeRegisterer<name> fhe_node_registerer_##module##_##name( #module, #name );
    #define FHE_NODE_INHERIT( module, name, parentModule, parentName ) ::fhe::core::NodeRegisterer<name> fhe_node_registerer_##module##_##name##_##parentModule##_##parentName( #module, #name, #parentModule, #parentName );
  }
}

#endif
